/*
Flexperimentos.
Copyright (C) 2007  Richard R Manzke

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
package br.absolutobrasil.validators
{
	import mx.validators.ValidationResult;
	import mx.validators.Validator;
	
	public class CNPJValidator extends Validator
	{
		include "../core/Versao.as";	
		  private var results:Array;
              private const CNPJ_LENGTH:int = 14;
             
                public function CNPJValidator(){
                        super();
                }
               
                override protected function doValidation(value:Object):Array{
                   var cnpj:String = String(value);
                        results = [];
                   
                        // Super classe é chamada para verificação de campo requerido.
                  results = super.doValidation(value);
                    if (results.length > 0)
                         return results;   
                      
                        // Verifica se o CNPJ tem comprimento correto.
                  if (cnpj.length != CNPJ_LENGTH && value){
                               results.push(new  ValidationResult(true, null, "invalido", "O CNPJ tem tamanho inválido."));
                             return results;
                 }
                       
                        // Verifica se o CNPJ é um número.
                      var pattern:RegExp = new RegExp("\\d{14}", "");
                 if (!pattern.test(cnpj)){
                               results.push(new ValidationResult(true, null, "NaN", "O CNPJ não é um número."));
                               return results;
                 }
                       
                        // Confere os dígitos verificadores
                     if (!ConfereDigitos(cnpj) && value){
                            results.push(new ValidationResult(true, null, "Invalido", "O CNPJ é inválido!"));                               
                                return results;
                 }
                       return results;
         }
               
                /**
              * Confere os digitos verificadores de um CNPJ.
          * @param nrCNPJ Número do CNPJ
          * @return O valor retornado será <code>true</code> se a verificação de digitos for verdadeira;
          */
             private function ConfereDigitos(nrCNPJ:String):Boolean{
                 
                        if (nrCNPJ.length != CNPJ_LENGTH)
                               return false;
                   
                        var cnpj:String = nrCNPJ;
                       var multiplicador:Array =  [5,4,3,2,9,8,7,6,5,4,3,2];
                   var multiplicador2:Array = [6,5,4,3,2,9,8,7,6,5,4,3,2];
                 var digito1:Number = Number(cnpj.charAt(12));
                   var digito2:Number = Number(cnpj.charAt(13));
                   var r:Number = 0;
                       
                        // Calculo do primeiro digito
                   for (var i:int = 0; i < multiplicador.length; i++){
                             r += Number(cnpj.charAt(i)) * multiplicador[i];
                         
                        }
                       r %= 11;
                        r = r < 2 ? 0 : 11 - r;
                 if (r != digito1)
                               return false;
                           
                        // Calculo do segundo digito
                    r = 0;
                  for (i = 0; i < multiplicador2.length; i++){
                            r += Number(cnpj.charAt(i)) * multiplicador2[i];
                        }
                       r %= 11;
                        r = r < 2 ? 0 : 11 - r;
                 if (r == digito2)
                               return true;
                    else
                            return false;
           }
	}
}